Работа с пакетом данных BSON-формата
BSON (Binary JS Object Notation) – двоичное представление текстового формата документов JSON-формата (JavaScript Object Notation – текстовый формат обмена данными, основанный на JavaScript), хранящее данные в виде пар «ключ/значение» как единый объект.
BSON-формат данных применяется для обмена данными с различными приложениями и получения данных из различных источников данных. Данные BSON-пакета обрабатывается как курсор без описателя полей.
Исходный BSON-пакет данных формирует клиентское приложение или получает его готовым из внешнего источника данных (максимальный размер пакета составляет 4000 байт) и передает для дальнейшей обработки СУБД ЛИНТЕР с помощью вызова хранимой процедуры. Хранимая процедура с помощью специальных средств процедурного языка для обработки данных BSON-пакета извлекает из пакета необходимую информацию и выполняет её дальнейшую обработку на стороне ЛИНТЕР-сервера (размещает в БД или в файле, возвращает клиентскому приложению полученный из внешнего источника и преобразованный BSON-пакет и т.п.).
Пример передачи на обработку процедуре pp1 BSON-пакета b1:
create or replace procedure pp2( ) result varchar(1024) declare var b1 varbyte(4000); var res varchar(1024); code b1 := hextoraw( "520000000300440000001069002B02000009647400E0325E7618000000027374720017 000000D092D181D0B5D0BC20D0BFD180D0B8D0B2D0B5D18221000530000204000000050 60708000300050000000000" ); call pp1( b1 ) into res; return res; end;
Для извлечения информации из документов BSON-пакета хранимая процедура должна обладать полной информацией об именах и/или типах данных полей документов. Доступ к полям документа возможен как по имени (если поле именованное), так и по их позиционному местоположению (для именованных и не именованных полей).
Схема обработки данных BSON-пакета
Пусть пакет данных BSON имеет следующую структуру:
BSON-пакет 'doc1' (int) 'I' (string) 'S' 'doc2' (string) 'S' (doc) 'doc21' (doc) 'doc22' ......... 'docN' (int) 'I'
Для доступа ко всем документам пакета:
-
открыть доступ к пакету BSON:
OPEN < cursor_bson > FOR BSON < пакет данных >;
-
с помощью оператора FETCH переместиться (позиционироваться) на нужный документ пакета (путем последовательного перемещения по документам или прямым переходом к нужному документу), например, на документ с именем 'doc2':
FETCH < cursor_bson > 'doc2';
В результате < cursor_bson > будет позиционирован на нужном документе пакета.
-
для перемещения по полям выбранного вложенного документа 'doc2' создать соответствующий курсор для позиционированного на предыдущем шаге документа:
OPEN < cursor_doc2 > FOR < cursor_bson >;
-
с помощью оператора FETCH переместиться (позиционироваться) на нужное поле документа (путем последовательного перемещения по полям документ или прямым переходом к нужному полю), например:
-
на вложенный документ с именем 'doc21':
FETCH < cursor_doc2 > 'doc21';
В результате < cursor_doc2 > будет позиционирован на нужном поле 'doc21';
-
или c помощью функции extract< тип > извлечь значение поля известного типа данных (с помощью функции extractvalue – текстовое значение поля с любым типом данных), например, значение поля 'S':
extractstring(< cursor_doc2 >, 'S');
-
-
т.к. поле 'doc21' является вложенным документом, то для доступа к его полям создать соответствующий курсор для позиционированного на предыдущем шаге поля:
OPEN < cursor_doc21 > FOR < cursor_doc2 >;
-
с помощью оператора FETCH перемещаться по полям документа с именем 'doc21':
FETCH < cursor_doc2 > 'doc21';
и c помощью функции extract< тип > или extractvalue извлекать значения нужных полей документа.